package com.itheima.demo02;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;

public class RollCall {
    public static void main(String[] args) throws IOException {
        //随机点名器  利用权重实现

        //1.读取文件中的姓名
        File file = new File("names.txt");
        BufferedReader bd = new BufferedReader(new FileReader(file));

        //2.创建学生对象集合把数据存入
        ArrayList<Student> list = new ArrayList<>();
        String line;
        while ((line = bd.readLine()) != null) {
            String[] arr = line.split("-");
            list.add(new Student(arr[0], arr[1], Integer.parseInt(arr[2]), Double.parseDouble(arr[3])));
        }
        //3.释放资源
        bd.close();

        //4.计算总权重
        double weight = 0;
        for (Student student : list) {
            weight = weight + student.getWeight();
        }

        //5.计算每个学生的权重  当前的权重/总权重
        double[] weightRange = new double[list.size()];
        int index = 0;
        for (Student student : list) {
            weightRange[index] = student.getWeight() / weight;
            index++;
        }
        //6.计算每个学生的权重范围  [0.1,0.2,0.3,0.4,0.5,....]  规律 就是 当前值 =  下一个值 + 0.1
        for (int i = 1; i < weightRange.length; i++) {
            weightRange[i] = weightRange[i] + weightRange[i - 1];
        }
        //结果 [0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]

        //7.生成一个0-1.0的随机值
        double random = Math.random();
        //8.利用二分查找 找出该随机值在数组中应该插入的位置
        //binarySearch方法的返回值
        //如果元素存在：返回元素在数组或列表中的索引位置（基于 0 的索引）。
        //如果元素不存在：返回一个负值，表示该元素在数组或列表中应插入的位置。具体而言，返回值为 -(插入位置) - 1。
        int result = -Arrays.binarySearch(weightRange, random) - 1; //这里的随机值在数组中是不存在的，所以表示插入的位置
        //result 表示在list集合中学生的索引
        //9.根据索引获取学生的信息
        Student student = list.get(result);
        //10.把随机到的学生权重每次的除2
        double w = student.getWeight() / 2;
        student.setWeight(w);//再重新把权重设置回去

        System.out.println(student.toString());
        //11.把集合中的学生数据再重新写入到names.txt文件中
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
        for (Student student1 : list) {
            bw.write(student1.toString());
            bw.newLine();
        }
        bw.close();


    }
}
